package com.winchain.chainbill.bill.biz.contract.controller;

import com.shell.bee.base.annotation.Logging;
import com.shell.bee.base.utils.SpringContextUtil;
import com.shell.bee.base.utils.StringUtil;
import com.shell.bee.entity.mvc.RetMsg;
import com.shell.bee.file.utils.CommonFileUtil;
import com.shell.bee.mvc.controller.BaseController;
import com.timevale.esign.sdk.tech.bean.result.Result;
import com.winchain.chainbill.ChainBillUtil;
import com.winchain.chainbill.bill.biz.contract.service.ContractBizService;
import com.winchain.chainbill.bill.biz.contract.vo.ContractRetVo;
import com.winchain.chainbill.bill.biz.send.vo.BatchBillStats;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ContractBizController extends BaseController {
	@Autowired
	private ContractBizService contractBizService;

	@RequestMapping
	@ResponseBody
	@Logging(module = "����", methods = "����������������")
	public ContractRetVo signContract(String bizType, String fileIds, String contracts, String invoices, String billIds)
			throws Exception {
		String[] billIdArr = billIds.split(",");
		ContractRetVo ret = this.contractBizService.signContracts(bizType, fileIds, contracts, invoices, billIds);
		if (ret.isSigned()) {
			BatchBillStats<?> stats = ret.getBatchBillStats();
			String msg = null;

			String msgType = null;
			boolean show = false;
			if ("13".equals(bizType)) {
				if (stats.getAffectedRows() == -1) {
					msg = "��������";
					show = false;
					msgType = "warning";
					ret.setBean(CommonFileUtil.changMsg(stats.getAbnormalMsg()));
				} else {
					msg = "����������������������������������������������������";
					show = true;
					msgType = "success";
					ret.setBean(stats.getTxSnHost());
				}
			} else if (billIdArr.length == stats.getAffectedRows()) {
				if ("10".equals(bizType)) {
					msg = "��������������������������������";
				} else if ("11".equals(bizType)) {
					msg = "��������������������������������";
				} else if ("12".equals(bizType)) {
					msg = "������������������������������������������������";
				} else if ("14".equals(bizType)) {
					msg = "������������������";
				}
				show = true;
				msgType = "success";
				ret.setBean(stats.getTxSnHost());
			} else if (stats.getAffectedRows() == 0) {
				if ("10".equals(bizType)) {
					msg = "������������";
				} else if ("11".equals(bizType)) {
					msg = "������������";
				} else if ("12".equals(bizType)) {
					msg = "������������";
				} else if ("14".equals(bizType)) {
					msg = "����������������";
				}
				msgType = "error";
				ret.setBean(CommonFileUtil.changMsg(stats.getAbnormalMsg()));
			} else if (stats.getAffectedRows() == -1) {
				if ("10".equals(bizType)) {
					msg = "��������������������������";
				} else if ("11".equals(bizType)) {
					msg = "��������������������������";
				} else if ("12".equals(bizType)) {
					msg = "��������������������������";
				}
				msgType = "error";
			} else {
				if ("10".equals(bizType)) {
					msg = "����������������";
				} else if ("11".equals(bizType)) {
					msg = "����������������";
				} else if ("12".equals(bizType)) {
					msg = "����������������";
				} else if ("14".equals(bizType)) {
					msg = "��������������������";
				}
				msgType = "warning";
				ret.setBean(CommonFileUtil.changMsg(stats.getAbnormalMsg()));
			}
			ret.setShow(show);
			ret.setType(msgType);
			ret.setMsg(msg);
		}
		return ret;
	}

	@RequestMapping({ "/contract-biz/receive-notice" })
	@ResponseBody
	@Logging(module = "����", methods = "��������")
	public String receiveNotice(String key, String content, String signed) throws Exception {
		this.contractBizService.handleNotice(key, content, signed);
		return "1";
	}

	@RequestMapping({ "/contract-biz/receive-callback" })
	@Logging(module = "����", methods = "��������")
	public Object receiveCallback(String key, String content, String signed) throws Exception {
		String params = this.contractBizService.handleCallback(key, content, signed);

		String path = SpringContextUtil.getProperty("contract.callback.page");
		if (StringUtil.notEmpty(params)) {
			path = path + params;
		}
		return initRedirect(path);
	}

	@RequestMapping
	@ResponseBody
	@Logging(module = "����", methods = "��������")
	public Map<String, String> download(String contractId) throws Exception {
		Map<String, String> params = this.contractBizService.download(contractId);
		return params;
	}

	@RequestMapping
	@ResponseBody
	@Logging(module = "����", methods = "��������")
	public Map<String, String> viewDoc(String contractId) throws Exception {
		Map<String, String> params = this.contractBizService.viewDoc(contractId);
		return params;
	}

	@RequestMapping
	@ResponseBody
	@Logging(module = "����", methods = "������������")
	public void confirm(String bizType, String fileIds, String contracts, String invoices, String billId)
			throws Exception {
		this.contractBizService.signContracts(bizType, fileIds, contracts, invoices, billId);
	}

	@RequestMapping
	@ResponseBody
	@Logging(module = "����", methods = "����������������������")
	public RetMsg getOnlineContPhoneCode() {
		if (ChainBillUtil.onEsign()) {
			Result result = this.contractBizService.getEsignPhoneCode();
			if (result.getErrCode() == 0) {
				return new RetMsg("success", false, "��������������");
			}
			return new RetMsg("error", true, "����������������" + result.getMsg());
		}
		if (ChainBillUtil.onCfca()) {
			return this.contractBizService.sendCfcaPaperlessSignPhoneCode();
		}
		return new RetMsg("warning", true, "������������������");
	}
}
